/*
	*@brief			:函数pthread_cancel()立即返回，不会等待目标线程的退出。默认情况下，目标线程也会立刻退出，
					其行为表现为如同调用了参数为 PTHREAD_CANCELED（其实就是(void *)-1）的pthread_exit()函数，
					但是，线程可以设置自己不被取消或者控制如何被取消，所以pthread_cancel()并不会等待线程终止，仅仅只是提出请求。

	*@param[thread]	:pthread_join()等待指定线程的终止，通过参数 thread（线程 ID） 指定需要等待的线程；

	*@return		:成功返回 0；失败将返回错误码。
 */
// int pthread_cancel(pthread_t thread);

#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <string.h>

static void *new_thread_start(void *arg)
{
	puts("新线程死循环执行");

	for (;;)
		//这里必须有睡眠函数，不然无法取消线程，这是个取消点函数
		sleep(1);

	return (void *)0;
}

int main(void)
{
	pthread_t tid;
	void *tret;
	int ret;

	//申请一个线程
	ret = pthread_create(&tid, NULL, new_thread_start, NULL);
	if (ret)
	{
		fprintf(stderr,"pthread_create error:%s\n",strerror(ret));
		exit(-1);
	}

	//取消一个线程
	ret = pthread_cancel(tid);
	if (ret)
	{
		fprintf(stderr, "pthread_cancel error:%s\n", strerror(ret));
		exit(-1);
	}

	//回收一个线程
	ret = pthread_join(tid, &tret);
	if (ret)
	{
		fprintf(stderr, "pthread_join error:%s\n", strerror(ret));

		exit(-1);
	}

	printf("新线程终止, code=%ld\n", (long)tret);

	exit(0);
}